package com.xd.pre.modules.tpshop.controller;

import com.xd.pre.common.utils.Result;
import com.xd.pre.modules.tpshop.domain.*;
import com.xd.pre.modules.tpshop.service.*;
import com.xd.pre.modules.tpshop.util.CommonFunction;
import com.xd.pre.modules.tpshop.virtuaBean.Cart_sum_virtrual;
import com.xd.pre.modules.tpshop.virtuaBean.Cart_virtrual;
import com.xd.pre.modules.tpshop.virtuaBean.OrderVirtual2App;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedInputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author lx
 * @since 2020-06-03
 */
@RestController
@RequestMapping("/cart")
public class TpCartController {

    @Autowired
    private ITpCartService cart_biz;
    @Autowired
    private ITpSpecGoodsPriceService sgp_biz;
    @Autowired
    private ITpGoodsService goods_biz;

    @Autowired
    private ITpUserAddressService address_biz;

    @Autowired
    private ITpUsersService user_biz;
    @Autowired
    private ITpShippingService ship_biz;

    @Autowired
    private ITpCouponListService cl_biz;
    @Autowired
    private ITpCouponService cou_biz;

    @Autowired
    private ITpUsersService u_biz;

    @Autowired
    private ITpShippingAreaService sa_biz;

    @Autowired
    private ITpOrderService order_biz;

    @Autowired
    private ITpOrderActionService orderAction_biz;

    @Autowired
    private ITpOrderGoodsService og_biz;

//    @Autowired
//    private ITpCouponListAction couponList_action;
//    @Autowired
//    private ITpOrderAction order_action;

    //【0】 http://localhost:8080/tpshop_server/cart/test0?orderId=126	&logTime=1435112599&statusDesc=提交订单
    @RequestMapping(value="/test0",method=RequestMethod.GET)

    public Result test0(HttpServletRequest request){
        Result result = new Result();
        String orderId = request.getParameter("orderId"); //
//		String logTime = request.getParameter("logTime"); //
//		String statusDesc = request.getParameter("statusDesc"); //

        result.setData( order_biz.update_confirmOrder_has_paytime(Integer.parseInt(orderId)) );
        return result;
    }

    /*
     * goods_id
     * goods_num	你选择的数量
     * goods_spec	你选择的spec  [颜色=52, 内存=49,...]
     * user_id
     *
     *  颜色						=				52
     * `tp_spec`表 中的name					 `tp_spec_item`表 的主键id
     *
     *
     *(int goods_id, int goods_num, String goods_spec, int user_id)
     *
     *	INSERT  INTO `tp_cart`(`user_id`,`goods_id`,`middle_spec_id`,`goods_num`)
     *		VALUES		      (       1,         1,	  	  	164, 	    1 		 )
     *
     */
    //	  http://localhost:8080/tpshop_server/cart/addCart?theUser_id=1&goods_id=1&goods_spec="11_55_102"&goods_num=1		// 测试不通过！！ （不能写成"11_55_102"）
    //【1】 http://localhost:8080/tpshop_server/cart/addCart?theUser_id=1&goods_id=1&goods_spec=11_55_102&goods_num=1			// 测试已通过！！
    @RequestMapping(value="/addCart",method=RequestMethod.GET)

    public Result addCart(HttpServletRequest request){
        Result result = new Result();
        System.out.println("到这里说明 正在addCart!");
        String theUser_id = request.getParameter("theUser_id"); //
        String goods_num = request.getParameter("goods_num"); //
        String goods_id = request.getParameter("goods_id"); //
        String goods_spec_1 = request.getParameter("goods_spec"); //  [颜色=55, 网络=11, 内存=102] ---> 55_11_102  ---> 11_55_102(注意：需要排序！！！)
        TpSpecGoodsPrice sgp_po = null;
        if(		null != theUser_id && !"".equals(theUser_id) && null != goods_num && !"".equals(goods_num) &&
                null != goods_id && !"".equals(goods_id)	 && null != goods_spec_1 && !"".equals(goods_spec_1)	){

//			String goods_spec = goods_spec_1.replace("[","").replace("]","");// 去除 [ ]
//			String[] spec_array1 = goods_spec.split(",");
//			List<String> list = new ArrayList<String>();
//			for (int i = 0; i < spec_array1.length; i++) {
//				String ite = spec_array1[i];					//颜色=52
//				String[] spec_array2 = goods_spec.split("=");	//取出   52
//				String val = spec_array2[1];					//取出   52
//
//				list.add(val);
//			}
//			String spec_key =  listToString(list, "_"); //还原 `tp_spec_godds_price`表中的 key
            sgp_po = sgp_biz.find_SpecGoodsPrice_byGoodsId_key(Integer.parseInt(goods_id), goods_spec_1); // , spec_key

            //先看看访问的 theUser_id goods_id  middleSpecId 在购物车里面 是否存在，if存在则只是update goods_num，if不存在 则insert !!

            TpCart cart_po = cart_biz.findCart_by_ugm(	Integer.parseInt(theUser_id),
                    Integer.parseInt(goods_id),
                    sgp_po.getMiddleSpecId() );
            if(null==cart_po || "".equals(cart_po)){
                System.out.println("将要add到cart的那个对象 购物车还 没有 add过！！");
                TpCart cc = new TpCart();
                cc.setUserId(Integer.parseInt(theUser_id));
                cc.setGoodsId(Integer.parseInt(goods_id));
                cc.setMiddleSpecId(sgp_po.getMiddleSpecId());
                cc.setGoodsNum(Integer.parseInt(goods_num));
                boolean res_insert = cart_biz.save(cc);
//                int res_insert = cart_biz.addCart(	Integer.parseInt(theUser_id), 	//int res_insert初始值 为-1(在Dao方法里面！！！)
//                        Integer.parseInt(goods_id),
//                        sgp_po.getMiddleSpecId(),
//                        Integer.parseInt(goods_num) );
                result.setTipMsg("insert的结果："+ res_insert + "(说明购物车中 还没有此对象，所以insert)");
                if(res_insert) 	result.setStatus(Result.SUCCESS);
                else				result.setStatus(Result.FAILED);
                result.setData(res_insert); // string 比较好处理一点 ！！
                // -1代表失败，1代表成功
            }else{ // cart_po对象不为null : 只是update goods_num		add到cart不应该影响 总库存(说明在加入cart的时候,所有人都是共享库存的,谁先付款 就先从总库存中减去！)！
                System.out.println("将要add到cart的那个对象 购物车里面 已经add 过！！");
                TpCart cart_po_existed = cart_biz.find_cart_byCartId(cart_po.getCartId() );
                int number_existed = cart_po_existed.getGoodsNum();
                int number_willUpdated = number_existed + Integer.parseInt(goods_num);
                int res_update = cart_biz.update_cart_number(number_willUpdated, cart_po.getCartId() );

                result.setTipMsg("update的结果："+ res_update + "(说明购物车中 已经没有此对象，所以update)");
                if(res_update > 0) 	result.setStatus(Result.SUCCESS);
                else				result.setStatus(Result.FAILED);
                result.setData(res_update); // string 比较好处理一点 ！！
            }

        }

        return result;
    }

    // 将TpCart列表 转化为  Cart_virtrual列表
    public List<Cart_virtrual> cartPo2Virtual(List<TpCart> cartList){
        List<Cart_virtrual> cv_list = new ArrayList<Cart_virtrual>();
        if(cartList!=null && !cartList.isEmpty()){
            Cart_virtrual cv = null;
            for (int i = 0; i < cartList.size(); i++) {
                cv = new Cart_virtrual(
                        cartList.get(i).getCartId(),
                        cartList.get(i).getUserId(),
                        cartList.get(i).getGoodsId(),
                        goods_biz.findGoods_bygoodsId(cartList.get(i).getGoodsId()).getGoodsSn(),
                        goods_biz.findGoods_bygoodsId(cartList.get(i).getGoodsId()).getGoodsName(),
                        goods_biz.findGoods_bygoodsId(cartList.get(i).getGoodsId()).getMarketPrice().doubleValue(),
                        goods_biz.findGoods_bygoodsId(cartList.get(i).getGoodsId()).getShopPrice().doubleValue(),		// goods_price; // 本店售价
                        cartList.get(i).getMemberGoodsPrice().doubleValue(),

                        cartList.get(i).getGoodsNum(),
                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartList.get(i).getMiddleSpecId()).getStoreCount(),	// 该商品此规格库存数量
                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartList.get(i).getMiddleSpecId()).getKey(),			// "3_4"			选择的规格key
                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartList.get(i).getMiddleSpecId()).getKeyName(),		//"颜色2:绿色 尺码:S", // 选择的规格

                        goods_biz.findGoods_bygoodsId(cartList.get(i).getGoodsId()).getSku(),
                        cartList.get(i).getSelected()
                );
                cv_list.add(cv);
            }
        }
        return cv_list;
    }

    public Cart_sum_virtrual func_Cart_sum_virtrual(List<Cart_virtrual> cv_list){
        System.out.println("合计test-测试-1-: "+ cv_list.toString() );

        List<Double> market_price_list = new ArrayList<Double>();
        List<Double> shop_price_list = new ArrayList<Double>();
        for (int i = 0; i < cv_list.size(); i++) {
            if(cv_list.get(i).getSelected() == 1){

                System.out.println("合计test-测试-2-: "+cv_list.get(i).getGoods_num());

                Double market_price = cv_list.get(i).getMarket_price(); 	// 市场售价
                Double shop_price 	= cv_list.get(i).getGoods_price(); 		// 本店售价
                int select_number	= cv_list.get(i).getGoods_num();		// 购物车购买数量
//				int store_number	= cv_list.get(i).getStore_count();		// 该商品此规格库存数量
                market_price_list.add(market_price * select_number);
                shop_price_list.add(shop_price * select_number);
            }
        }

        Double shop_price_sum = 0.0;							//本店售价合计price（购物车的 合计value） 	"total_fee"
        for (int i = 0; i < shop_price_list.size(); i++) {
            shop_price_sum += shop_price_list.get(i);
        }
        Double market_price_sum = 0.0;							//市场售价合计price（有本店价 构成）
        for (int i = 0; i < market_price_list.size(); i++) {
            market_price_sum += market_price_list.get(i);
        }
        Double cut_fee = market_price_sum - shop_price_sum;		//								"cut_fee"

        Cart_sum_virtrual csv = new Cart_sum_virtrual(shop_price_sum, cut_fee);
        return csv;
    }

    //【2】 http://localhost:8080/tpshop_server/cart/findAll_cart			//验证通过！
    @RequestMapping(value="/findAll_cart",method=RequestMethod.GET)

    public Result findAll_cart(HttpServletRequest request){
        Result result = new Result();

        JSONObject jb = new JSONObject();

        List<Cart_virtrual> cv_list = cartPo2Virtual(cart_biz.findAll_cart());

        jb.put("cartList", cv_list);

        Cart_sum_virtrual csv = func_Cart_sum_virtrual( cv_list);

        jb.put("total_price", csv);

        result.setData(jb);

        return result;
    }

    //【2.1】  http://localhost:8080/tpshop_server/cart/test?cartID=597&goodsNum=4&selected=0			//
    @RequestMapping(value="/test",method=RequestMethod.GET) //

    public Result test(HttpServletRequest request){
        Result result = new Result();
        String theUser_id = request.getParameter("cartID"); //
        String goods_num = request.getParameter("goodsNum"); //
        String storeCount = request.getParameter("storeCount"); //
        String selected = request.getParameter("selected"); //
        if( 	null!=theUser_id&&!"".equals(theUser_id)
                &&	null!=goods_num&&!"".equals(goods_num)
                &&	null!=storeCount&&!"".equals(storeCount)
                &&	null!=selected&&!"".equals(selected)

        ){

        }

        int res2 = cart_biz.update_cart_by_postJsonArray(
                Integer.parseInt(goods_num),
                Integer.parseInt(selected),
                Integer.parseInt(theUser_id)

        );
        result.setData(res2);

        return result;
    }

    /*
     * 需要接收 这样子的 JSONArray：
     * formDataArray=[{"cartID":"1027","goodsNum":"3","storeCount":"100","selected":"1"},
     *				  {"cartID":"1028","goodsNum":"2","storeCount":"100","selected":"1"}]
     *
     */
    //【3<有2 演变而来>】 http://localhost:8080/tpshop_server/cart/updateCart_by_selected_NumChanged			//
    @RequestMapping(value="/updateCart_by_selected_NumChanged",method=RequestMethod.POST) //这块不能用 .GET 了 ！！！

    public Result updateCart_by_selected_NumChanged(HttpServletRequest request){
        Result result = new Result();
        StringBuffer sb = null ;
        try {
            System.out.println("测试--0.1--->: "+  request.getInputStream().toString() );

            BufferedInputStream in = new BufferedInputStream(request.getInputStream());

            sb = new StringBuffer(2048); // 注意：有了这一步，★★★则 sb != null

            int i;
            char c = 0;
            while (( i = in.read()) != -1) {

                sb.append( (char) i );	// ★★★ server端 成功获取 安卓端传来的 json格式请求 ★★★
            }
            System.out.println("测试--0.2--->: "+  sb ); //如果 InputStream中 没有东西，则sb.length() = 0
            System.out.println("测试--0.2.1-sb.length()-->: "+  sb.length() ); // 没有任何值的情况下， sb.length() 为 2 (即 那两个中括号 ！！)
        }catch (Exception ex) {
            System.out.println("测试--0.3-ex.toString()-->: "+  ex.toString());
            ex.printStackTrace();
        }

        JSONArray formDataArray = null ;//new JSONArray();

        if(sb.length() > 2){  // sb != null && !sb.equals("") &&    可写小程序测试 ！！！
            System.out.println("测试--0.4-sb.toString(): "+ sb.toString() );

            //    	JSONObject  dataJson = (JSONObject) JSONObject.toJSON( sb.toString() ); //  ★★★ fastjson	  不可以 ！
            //    	JSONObject  dataJson = JSONObject.fromObject( sb.toString() );		    //		net.sf.json  也可以 ！
            formDataArray = JSONArray.fromObject( sb.toString().trim() ); //"[" + sb.toString() + "]"   A JSONArray text must start with '['
            //    	  formDataArray=[{"cartID":"1027","goodsNum":"3","storeCount":"100","selected":"1"},
            //    	          	     {"cartID":"1028","goodsNum":"2","storeCount":"100","selected":"1"}]
            System.out.println("测试--0.5-formDataArray.toString(): "+formDataArray.toString() );
            //[{"selected":1,"cartID":1,"goodsNum":1,"storeCount":100},
            // {"selected":1,"cartID":1,"goodsNum":38,"storeCount":100},
            // {"selected":1,"cartID":39,"goodsNum":1,"storeCount":100} ]
        }


        JSONObject jb = new JSONObject();
        int res1 = 0;

        // formDataArray!=null && formDataArray.length() > 0
        if(formDataArray != null && formDataArray.size() > 0){	// 先update db中data，然后再取出来给android   即使是空的也有“ [ ] ” 所以需要formDataArray.size() > 2

            System.out.println("测试--0.6.1-formDataArray.size() : " + formDataArray.size() );

            for (int i = 0; i < formDataArray.size(); i++) {
                String the_cartID = formDataArray.getJSONObject(i).getString("cartID");
                String the_goodsNum = formDataArray.getJSONObject(i).getString("goodsNum");
                String the_storeCount = formDataArray.getJSONObject(i).getString("storeCount");
                String the_selected = formDataArray.getJSONObject(i).getString("selected");
                System.out.println("测试--0.6.2-action- : " + the_goodsNum );
                System.out.println("测试--0.6.3-action- : " + the_selected );
                System.out.println("测试--0.6.4-action- : " + the_cartID );

//	    		[{"cartID":1,"goodsNum":5,"selected":0,"storeCount":100},
//	    		 {"cartID":1,"goodsNum":38,"selected":1,"storeCount":100},
//	    		 {"cartID":39,"goodsNum":1,"selected":1,"storeCount":100}]
                int res2 = cart_biz.update_cart_by_postJsonArray(	Integer.parseInt(the_goodsNum) ,  // + existed_goodsNum
                        Integer.parseInt(the_selected),
                        Integer.parseInt(the_cartID)
                );
                System.out.println("测试--0.7-action-update的条数 : " + res2 );

                res1 += res2; // 记录刷新 的条数
            }
            System.out.println( "实际update的条数："+res1 + "" + "; 如果update的话，本次一共应该更新的条数为："+ formDataArray.size() ); //1.此步，只是更新了 db中的data
            List<Cart_virtrual> cv_list2 = cartPo2Virtual(cart_biz.findAll_cart()); 															 //2.重新获取db中 更新过的 data
            jb.put("cartList", cv_list2);
            Cart_sum_virtrual csv = func_Cart_sum_virtrual( cv_list2);
            jb.put("total_price", csv);

            result.setTipMsg("update完db中数据，然后重新获取最新cart的data，传给android更新cart UI界面(formDataArray！=null)");
            result.setData(jb);

        }else{ 														// 只是 刚好跳转到 cart界面！
            System.out.println("测试--0.6.2-说明 只是 刚好跳转到 cart界面！  "  );

            //重新刷新 db数据：
            List<Cart_virtrual> cv_list = cartPo2Virtual(cart_biz.findAll_cart());
//    		List<Cart_virtrual> cv_list = cartPo2Virtual();
            jb.put("cartList", cv_list);
            Cart_sum_virtrual csv = func_Cart_sum_virtrual( cv_list);
            jb.put("total_price", csv);

            result.setTipMsg("只是 刚好跳转到 cart界面(formDataArray=null)");
            result.setData(jb);
        }

        return result;
    }


    //从购物车列表跳转过去的 确认订单界面 所需的所有数据：
    //【4：cart2<PHP> 】 http://localhost:8080/tpshop_server/cart/findContent_inConformOrder_cart2?theUser_id=1			//
    @RequestMapping(value="/findContent_inConformOrder_cart2",method=RequestMethod.GET)

    public Result findContent_inConformOrder_cart2(HttpServletRequest request){
        Result result = new Result();

        JSONObject jb = new JSONObject();

        try {
            String theUser_id = request.getParameter("theUser_id"); //
            List<TpUserAddress> addressList = address_biz.findTheUserAddress_byUserId(Integer.valueOf(theUser_id));

            jb.put("addressList", addressList);
            jb.put("shippingList", ship_biz.list());//貌似 TpShipping 物流表 与其他表之间都没有什么联系(要有也是将来如果添加 商家bean的话 他们有关系把)，so直接查找all
            // app那边实际也就只有用到了TpShipping("tp_shipping")中的 code、name这两个属性

            //"cartList" 和  "totalPrice" 这两个json 不用写， 在app端 cart界面跳转到确认订单界面的时候  用intent把数据传过去就行了！！！<当然也可以在这里写>
            List<TpCart> $order_goods_list = cart_biz.findCartList_withChecked();
            jb.put("cartList", cartPo2Virtual($order_goods_list ) );
//			List<TpGoods> goods_list = new ArrayList<TpGoods>();
//	    	for (int i = 0; i < $order_goods_list.size(); i++) {
//	    		int gId = $order_goods_list.get(i).getGoodsId();
//	    		TpGoods temp = goods_biz.findGoods_bygoodsId( gId);
//	    		goods_list.add(temp);
//			}
//	    	jb.put("goodsList", goods_list );
            jb.put("totalPrice", func_Cart_sum_virtrual(cartPo2Virtual(cart_biz.findCartList_withChecked())  ) );// "zj"(总计金额)--"total_fee", "jy"(共节约)--"cut_fee"

            //因为CouponVirtual实体 是TpCoupon与TpCouponList组合出来的 虚拟实体，so不能直接调用 biz层中的方法 来实现(非 组合出来的虚拟实体 都可以直接调用biz来取值！) ！！！
            //利用springMvc的注解 直接调用  TpCouponListAction.java中的findCouponVirtualList_byUid_invoked(int uId)方法:
            jb.put("couponList", cl_biz.findCouponVirtualList_byUid_invoked(Integer.parseInt(theUser_id) ) );
            // 这里主要是用到了一个想法：在生成订单对象的前一刻 创建一个虚拟(sql中：c2.order_id = 0 )的order对象,等到真正创建order的那一刻 再把需要属性给真正创建的那个order对象！！！ c2.order_id = 0代表优惠券还没有被分配！

            jb.put("userInfo", u_biz.findUser_ById(Integer.parseInt(theUser_id) ) );

            result.setData(jb);
        } catch (Exception e) {
            System.out.println("去人订单---e.toString(): " + e.toString());
            result.setStatus(Result.FAILED);
        }

        return result;
    }




    //  http://localhost:8080/tpshop_server/cart/getOrderTotalFee_cart3?act=order_price&address_id=130&theUser_id=1
//【5：cart3<PHP> 】 http://localhost:8080/tpshop_server/cart/getOrderTotalFee_cart3?theUser_id=1&invoice_title=123&address_id=1&shipping_code=sto_express&pay_points=100&user_money=100&couponTypeSelect=1&coupon_id=1&couponCode=0&act=order_price
    @RequestMapping(value="/getOrderTotalFee_cart3",method=RequestMethod.GET)

    public Result getOrderTotalFee_cart3(HttpServletRequest request){


        String theUser_id = request.getParameter("theUser_id"); 			//[0]
        String invoice_title = request.getParameter("invoice_title"); 		//[1]发票
        String address_id = request.getParameter("address_id"); 			//[2]收货地址id
        String shipping_code = request.getParameter("shipping_code"); 		//[3]物流编号									//null
        String pay_points = request.getParameter("pay_points"); 			//[4]使用积分 									//选择toggle开关才不为null
        String user_money = request.getParameter("user_money"); 			//[5]使用余额 									//选择toggle开关才不为null
        String couponTypeSelect = request.getParameter("couponTypeSelect");	//[6]优惠券类型  1 下拉框选择优惠券 2 输入框输入优惠券代码		//选择使用coupon才不为null
        String coupon_id = request.getParameter("coupon_id"); 				//[7]优惠券id 								//选择使用coupon才不为null
        String couponCode = request.getParameter("couponCode"); 			//[8]优惠券代码(兑换码)
        String act = request.getParameter("act"); 							//[9]
        //非空验证 以后再做

        System.out.println("-1-theUser_id:"+theUser_id);
        System.out.println("-2-address_id:"+address_id);
        System.out.println("-3-shipping_code:"+shipping_code);
        System.out.println("-4-pay_points:"+pay_points);
        System.out.println("-5-user_money:"+user_money);
        System.out.println("-6-couponTypeSelect:"+couponTypeSelect);
        System.out.println("-7-coupon_id:"+coupon_id);

        int selectNum = cart_biz.findCount_selectCartPO(Integer.parseInt(theUser_id));
        if(selectNum==0){//if ($this->cartLogic->cart_count($this->user_id, 1) == 0) exit(json_encode(array('status' => -1, 'msg' => '你的购物车没有选中商品', 'result' => null)));
            Result result = new Result(); //if (!$address_id) exit(json_encode(array('status' => -1, 'msg' => '请完善收货人信息', 'result' => null))); // 返回结果状态
//    		JSONObject jb = new JSONObject(); jb.put("status", -1); jb.put("msg", "你的购物车没有选中商品"); jb.put("result", null);
            result.setStatus(Result.FAILED);
            result.setTipMsg("你的购物车没有选中商品");
//    		result.setData(jb);  //null
            return result;
        }
        if (!CommonFunction.stringCheckNotNull(address_id)) {
            Result result = new Result(); //if (!$address_id) exit(json_encode(array('status' => -1, 'msg' => '请完善收货人信息', 'result' => null))); // 返回结果状态
//    		JSONObject jb = new JSONObject(); jb.put("status", -1); jb.put("msg", "请完善收货人信息"); jb.put("result", null);
            result.setTipMsg("请完善收货人信息");
            result.setStatus(Result.FAILED);
//    		result.setData(jb);
            return result;
        }
        if (!CommonFunction.stringCheckNotNull(shipping_code)) {
            Result result = new Result(); //exit(json_encode(array('status' => -1, 'msg' => '请选择物流信息', 'result' => null))); // 返回结果状态
//    		JSONObject jb = new JSONObject(); jb.put("status", -1); jb.put("msg", "请选择物流信息"); jb.put("result", null);
            result.setTipMsg("请选择物流信息");
            result.setStatus(Result.FAILED);
//    		result.setData(jb);
            return result;
        }

        TpUserAddress $address = address_biz.findUserAddress_byKeyId(Integer.parseInt(address_id) );// M('UserAddress')->where("address_id = $address_id")->find();//通过 收货地址id find哪个UserAddress实体 从而得到该对象的district、city、province
        List<TpCart> $order_goods_list = cart_biz.findCartList_withChecked(); // M('cart')->where("user_id = {$this->user_id} and selected = 1")->select();
        System.out.println("★197-"+$order_goods_list.size());
        List<TpGoods> goods_list = new ArrayList<TpGoods>();
        for (int i = 0; i < $order_goods_list.size(); i++) {
            int gId = $order_goods_list.get(i).getGoodsId();
            TpGoods temp = goods_biz.findGoods_bygoodsId( gId);
            goods_list.add(temp);
        }
        System.out.println("★198-"+$order_goods_list.size());

        // Integer.parseInt() 返回的是一个int的值。Integer.valueof()返回的是Integer的对象。Integer.valueof().intValue();返回的也是一个int的值。
        JSONObject $result = calculate_price(Integer.parseInt(theUser_id)  //计算订单金额
                ,$order_goods_list
                ,shipping_code					//null
                ,$address.getProvince()
                ,$address.getCity()
                ,$address.getDistrict()
                ,Integer.parseInt(pay_points)	//null
                ,Double.parseDouble(user_money)	//null
                ,coupon_id						//null
                ,couponCode
                ,couponTypeSelect 				//null
        );

        System.out.println("测试-103:"+ $result.toString() );
//{"result":{"total_amount":2288,"order_amount":2167,"goods_price":2288,"order_goods":[{"goodsId":39,"selected":1,"userId":1,"middleSpecId":66,"cartId":1336,"goodsNum":1}],"cut_fee":100,"anum":1,"user_money":100,"coupon_price":20,"integral_money":1,"shipping_price":0},"status":1,"msg":"计算价钱成功"}

        if ($result.getInt("status") < 0){ //$result['status'] < 0
//			 exit(json_encode($result));
            Result result = new Result();
            result.setStatus(Result.FAILED);
            result.setTipMsg("返回的计算订单金额(json格式)的 status< 0的情况");
            result.setData($result);
            return result;
        }

        // 订单满额优惠活动
//		  $order_prom = get_order_promotion($result['result']['order_amount']);
//        $result['result']['order_amount'] = $order_prom['order_amount'];
//        $result['result']['order_prom_id'] = $order_prom['order_prom_id'];
//        $result['result']['order_prom_amount'] = $order_prom['order_prom_amount'];


        System.out.println("-11-:"+$result.getJSONObject("result").getInt("shipping_price"));
        System.out.println("-12-:"+$result.getJSONObject("result").getDouble("coupon_price"));
        System.out.println("-13-:"+$result.getJSONObject("result").getDouble("user_money"));
        System.out.println("-14-:"+$result.getJSONObject("result").getDouble("integral_money"));
        System.out.println("-15-:"+$result.getJSONObject("result").getDouble("order_amount"));
        System.out.println("-16-:"+$result.getJSONObject("result").getDouble("goods_price"));

        JSONObject $car_price = new JSONObject();
        $car_price.put("postFee", 	$result.getJSONObject("result").getInt("shipping_price"));		// 物流费
        $car_price.put("couponFee", $result.getJSONObject("result").getDouble("coupon_price"));		// 优惠券抵扣金额
        $car_price.put("balance", 	$result.getJSONObject("result").getDouble("user_money"));		// 余额支付金额
        $car_price.put("pointsFee", $result.getJSONObject("result").getDouble("integral_money"));	// 积分抵扣金额
        $car_price.put("payables", 	$result.getJSONObject("result").getDouble("order_amount"));		// 应付金额
        $car_price.put("goodsFee", 	$result.getJSONObject("result").getDouble("goods_price"));		//商品总价  //商品总额

//		'order_prom_id' => $result['result']['order_prom_id'], 			// 订单优惠活动id		php
//	    'order_prom_amount' => $result['result']['order_prom_amount'], 	// 订单优惠活动优惠了多少钱 	php
        $car_price.put("order_prom_id", 	0);							// 订单优惠活动id（以后在研究这个！现在先给个0）
        $car_price.put("order_prom_amount", 0);							// 订单优惠活动优惠了多少钱

        System.out.println("测试-104:"+ $car_price.toString() );
        //{"postFee":0,"order_prom_amount":"","balance":100,"pointsFee":1,"payables":2167,"goodsFee":2288,"order_prom_id":0,"couponFee":20}
        System.out.println("测试-105:"+ $car_price.getDouble("postFee") );

        // 提交订单
        if (act.equals("submit_order")) { //提交订单
            int coupon_id_int = -1; // -1 代表 null的意思
            if(CommonFunction.stringCheckNotNull(coupon_id)){
                coupon_id_int = Integer.parseInt(coupon_id);
            }
            if ("".equals(coupon_id) && !"".equals(couponCode) ){ //使用的是 优惠券代码(兑换码) 而非优惠券id  //(empty($coupon_id) && !empty($couponCode))
                coupon_id_int = cl_biz.findCouponList_byCode(couponCode).getCouponlistId();
            }

            System.out.println("测试-105.1:"+shipping_code  );

            JSONObject jb = addOrder(Integer.parseInt(theUser_id),Integer.parseInt(address_id),
                    shipping_code,invoice_title,  coupon_id_int, $car_price );//,goods_list
            System.out.println("测试-105.2:"+jb.toString()  );
            Result result = new Result();
            result.setData(jb);  //{"result":683,"status":1,"msg":"提交订单成功"}
            return result;   // {"status":"success","tipCode":"","tipMsg":"","data":{"result":683,"status":1,"msg":"提交订单成功"}}
        }

        System.out.println("测试-106:"  );

        Result result = new Result();

//		JSONObject jb = new JSONObject(); jb.put("status", 1); jb.put("msg", "计算成功"); jb.put("result", $car_price);
        result.setStatus(Result.SUCCESS);
        result.setTipMsg("计算成功");
        result.setData($car_price);

        return result;
//{"status":"success","tipCode":"","tipMsg":"","data":{"result":{"postFee":0,"balance":100.0,"order_prom_amount":"","pointsFee":1.0,"payables":2167.0,"goodsFee":2288.0,"couponFee":20.0,"order_prom_id":0},"status":1,"msg":"计算成功"}}
    }

    /**
     *  添加一个订单 cart3提交订单
     *   type $user_id         用户id
     *   type $address_id      地址id
     *   type $shipping_code   物流编号
     *   type $invoice_title   发票
     *   type $coupon_id       优惠券id
     *   type $car_price       各种价格  {"status":"success","tipCode":"","tipMsg":"","data":{"result":{"postFee":0,"balance":100.0,"order_prom_amount":"","pointsFee":1.0,"payables":2167.0,"goodsFee":2288.0,"couponFee":20.0,"order_prom_id":""},"status":1,"msg":"计算成功"}}
     * @return type $order_id       返回新增的订单id
     */
    public JSONObject addOrder(int $user_id,int $address_id,String $shipping_code,String $invoice_title,int $coupon_id ,JSONObject $car_price){//, List<TpGoods> goods_list

        // limit 1天只能下 50 单
        int $order_count = order_biz.findOrderLimit_inToday($user_id);//-1则代表 没有find结果
        if($order_count >= 50) {
            JSONObject  jb = new JSONObject(); jb.put("status", -9); jb.put("msg", "一天只能下50个订单"); jb.put("result", "");
            return jb;
        }

        TpUserAddress $address = address_biz.findUserAddress_byKeyId($address_id);//
        TpShipping shippingPO = ship_biz.find_cart_byshipping_code($shipping_code);
        //记录当前时间戳(java 14位 时间戳 + 四位随机整数)： 用于在 `tp_order_action`表查找 该表的主键！
        String now_timestamp_1 = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) ; //"order_sn"
        String now_timestamp_2 = now_timestamp_1 + ( (int)(Math.random()*(9999-1000+1))+1000 );
        System.out.println("★104.9-now_timestamp: "+ now_timestamp_2);//2017 0406 1950 20 + 6843

//    	List<TpCart> $order_goods_list2 = cart_biz.findCartList_withChecked();
//    	System.out.println("★199-"+$order_goods_list2.size());

        TpOrder oo3 = new TpOrder();
        oo3.setOrderSn(now_timestamp_2);//"order_sn" UNIQUE KEY `order_sn` (`order_sn`), so可以直接利用 `order_sn`查找到 自动生成的新的 `order_id`
        oo3.setUserId($user_id);    // 用户id
        //`action_id`						//由于此时还没有形成当前order的keyId，所以此时没办法 add到`tp_order_action`表，so先设为零，之后再add进去
        oo3.setAddressId($address_id);//收货地址 id
        //`payment_id`						//支付 (注意:此时还没到达支付的那一步！)  default 0
        oo3.setInvoiceTitle($invoice_title);//'发票抬头'

        oo3.setGoodsPrice(new BigDecimal($car_price.getDouble("goodsFee")));//商品总价
        oo3.setShippingPrice(new BigDecimal($car_price.getDouble("postFee")));// 物流费
        oo3.setUserMoney(new BigDecimal($car_price.getDouble("balance")));//'使用余额'
        oo3.setCouponPrice(new BigDecimal($car_price.getDouble("couponFee")));//'使用优惠券'
        oo3.setIntegral($car_price.getInt("pointsFee") * 100 );             //'使用积分'
        oo3.setIntegralMoney(new BigDecimal($car_price.getInt("pointsFee")));//'使用积分抵多少钱'

        oo3.setOrderAmount(new BigDecimal($car_price.getDouble("payables")));//'应付款金额'
        oo3.setTotalAmount(new BigDecimal(($car_price.getDouble("goodsFee") + $car_price.getDouble("postFee"))));// 订单总额"total_amount"  = 商品总价 + 物流费
        oo3.setAddTime(Integer.parseInt(String.valueOf(System.currentTimeMillis()).toString().substring(0,10)));// 下单时间"add_time"      //java取时间戳是13位的，要舍弃后三位，就是php中的10位了，不影响正常使用

        oo3.setOrderPromId($car_price.getInt("order_prom_id"));//'订单优惠活动id'（以后在研究这个！现在先给个0）"order_prom_id"
        oo3.setOrderPromAmount(new BigDecimal($car_price.getDouble("order_prom_amount")));//'订单优惠活动优惠了多少钱'"order_prom_amount"
        boolean save2 = order_biz.save(oo3);
        int res = save2 ? 1 : -1;
//        int res = order_biz.addOrder_part1(
//                now_timestamp_2, //"order_sn" UNIQUE KEY `order_sn` (`order_sn`), so可以直接利用 `order_sn`查找到 自动生成的新的 `order_id`
//                $user_id,	 // 用户id
////	    				//`action_id`						////由于此时还没有形成当前order的keyId，所以此时没办法 add到`tp_order_action`表，so先设为零，之后再add进去
//                $address_id,						//收货地址 id
//                shippingPO.getShippingId(),			//"shipping_id"物流id
////		    			//`payment_id`						////支付 (注意:此时还没到达支付的那一步！)  default 0
//                $invoice_title,						//'发票抬头'
//
//                $car_price.getDouble("goodsFee"),			//商品总价			"goods_price"
//                $car_price.getDouble("postFee"),			// 物流费  			"shipping_price"
//                $car_price.getDouble("balance"),			//'使用余额'		"user_money"
//                $car_price.getDouble("couponFee"),			//'使用优惠券'		"coupon_price"
//                $car_price.getInt("pointsFee") * 100 ,		//'使用积分'		"integral"		100积分等于 1 块钱
//                $car_price.getDouble("pointsFee"), 			//'使用积分抵多少钱'	"integral_money"
//
//                $car_price.getDouble("payables"),			//'应付款金额'		"order_amount"
//                $car_price.getDouble("goodsFee") + $car_price.getDouble("postFee") ,	// 订单总额"total_amount"  = 商品总价 + 物流费
//                Integer.parseInt(String.valueOf(System.currentTimeMillis()).toString().substring(0,10)),// 下单时间"add_time"      //java取时间戳是13位的，要舍弃后三位，就是php中的10位了，不影响正常使用
//
//                $car_price.getInt("order_prom_id"),				//'订单优惠活动id'（以后在研究这个！现在先给个0）"order_prom_id"
//                $car_price.getDouble("order_prom_amount")		//'订单优惠活动优惠了多少钱'"order_prom_amount"
//        );
        int order_id = -1; //初始化一个不可能存在的 order_id ！
        TpOrder orderPO = null;
        if(res == 0){ //插入失败
            JSONObject  jb = new JSONObject(); jb.put("status", -8); jb.put("msg", "添加订单失败: addOrder_part1()失败,请查找原因！"); jb.put("result", "");
            return jb;
        }else{ //插入成功：res=1<insert只能单条插入>，则  // 记录订单操作日志(`tp_order_action`)：

            orderPO = order_biz.findOrder_by_order_sn(now_timestamp_2);
            order_id = orderPO.getOrderId();
            System.out.println("★107-: " + order_id+"; \n"+orderPO.getPaymentId());//492

//    		int log_time = Integer.parseInt(String.valueOf(System.currentTimeMillis()).toString().substring(0,10));//操作时间      //java取时间戳是13位的，要舍弃后三位，就是php中的10位了，不影响正常使用
//    		System.out.println("★108-: " + log_time);//

            TpOrderAction rr = new TpOrderAction();
            rr.setOrderId(order_id);
            rr.setLogTime(CommonFunction.get_Timestamp_java_10_int());
            rr.setStatusDesc("提交订单");
            boolean save1 = orderAction_biz.save(rr);
            int res_aad_orderAction = save1 ? 1 : -1;
//            int res_aad_orderAction = orderAction_biz.aad_orderAction(order_id,  CommonFunction.get_Timestamp_java_10_int(),"提交订单");
            if(res_aad_orderAction==0){
                JSONObject  jb = new JSONObject(); jb.put("status", -9.1); jb.put("msg", "insert订单操作日志表(`tp_order_action`)失败: aad_orderAction()失败,请查找原因！"); jb.put("result", "");
                return jb;
            }

            // 提交order后 删除上一刻钟刚刚selected=1的cart中的cart对象, 同时为了记录当前这个order所持有的goodsList 故把它  插入到`tp_order_goods`表
            // 1插入order_goods 表 `tp_order_goods`	`tp_order_goods`的主要作用：为了记录 一个order 所持有的 goodsList！！！
            List<TpCart> $order_goods_list = cart_biz.findCartList_withChecked();
            System.out.println("★200-"+$order_goods_list.size() );

//	    	List<TpGoods> goods_list = new ArrayList<TpGoods>();
            List<TpOrderGoods> og_list = new ArrayList<TpOrderGoods>();
            for (int i = 0; i < $order_goods_list.size(); i++) {
                TpCart cartTemp = $order_goods_list.get(i);
                int goodsId = cartTemp.getGoodsId();
                TpGoods ss = goods_biz.findGoods_bygoodsId( goodsId);
//	    		goods_list.add(goods_temp);
                System.out.println("打印——i—："+i);

                TpOrderGoods oo = new TpOrderGoods();
                oo.setOrderId(order_id);
                oo.setGoodsId(cartTemp.getGoodsId());
                oo.setGoodsName(ss.getGoodsName());
                oo.setGoodsSn(ss.getGoodsSn());

                oo.setGoodsNum(cartTemp.getGoodsNum());
                oo.setMarketPrice(ss.getMarketPrice());
                oo.setGoodsPrice(ss.getShopPrice());
                oo.setCostPrice(ss.getCostPrice());
                oo.setMemberGoodsPrice(cartTemp.getMemberGoodsPrice());
                oo.setGiveIntegral(ss.getGiveIntegral());

                oo.setSpecKey(sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getKey());
                oo.setSpecKeyName(sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getKeyName());

                oo.setBarCode(sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getBarCode());

                oo.setIsComment(0);		//isComment

                oo.setPromType(0);// 0,			//promType 利用	 orderPromId	在tp_order_goods表中 找到 type  以后再引入tp_order_goods表！！！
                oo.setPromId(orderPO.getOrderPromId());	// 活动id	（orderPromId） order表中的orderPromId			tp_prom_order (tp_order_goods)

                oo.setIsSend(0);// 0,		//isSend
                oo.setDeliveryId(0);// 0,//deliveryId	`tp_delivery_doc`表id
                oo.setSku(sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getSku());

                boolean save = og_biz.save(oo);
                int row = save ? 1 : -1;

//                int row = og_biz.insert2OrderGoods(
//                        order_id,											// 订单id		order表
//                        cartTemp.getGoodsId(),				// 商品id		cart表
//                        ss.getGoodsName(),							// 商品名称	good表
//                        ss.getGoodsSn(),							// 商品货号	good表
//
//                        cartTemp.getGoodsNum(),				// 购买数量	cart表
//                        ss.getMarketPrice(),						// 市场价		good表
//                        ss.getShopPrice(),							// 商品价 本店价  good表
//                        ss.getCostPrice(),							// 成本价
//                        cartTemp.getMemberGoodsPrice(),		// 会员折扣价.
//                        ss.getGiveIntegral(),						// 购买商品赠送积分
//
//                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getKey(),			// 商品规格	28_55	`tp_spec_goods_price`表
//                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getKeyName(),		// 商品规格名称			`tp_spec_goods_price`表
//
//                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getBarCode(),		//商品bar_code		`tp_spec_goods_price`表
//
//                        0,		//isComment
//
//                        0,							// 利用	 orderPromId	在tp_order_goods表中 找到 type  以后再引入tp_order_goods表！！！
//                        orderPO.getOrderPromId(),	// 活动id	（orderPromId） order表中的orderPromId			tp_prom_order (tp_order_goods)
//
//                        0,		//isSend
//                        0,		//deliveryId	`tp_delivery_doc`表id
//                        sgp_biz.find_SpecGoodsPrice_by_primaryKey(cartTemp.getMiddleSpecId()).getSku()			//商品sku				`tp_spec_goods_price`表
//                );
                System.out.println("★插入-tp_order_goods-表的结果(row): "+row);

                if(row > 0){
                    //    付完款后  扣除商品库存	add到cart不应该影响 总库存(说明在加入cart的时候,所有人都是共享库存的,谁先付款 就先从总库存中减去！)！
                }

            }

        }

        // 如果应付金额为0  可能是余额支付 + 积分 + 优惠券 这里订单支付状态直接变成已支付
        //if($data['order_amount'] == 0){update_pay_status($order['order_sn'], 1);    //支付完成修改订单   }

        // 2修改优惠券状态
        if($coupon_id > 0){
            int theUsedCouponTypeId = cl_biz.findCouponId_byCouponlist_id($coupon_id);//此接口可能有些问题！！！！
            if(theUsedCouponTypeId != -1){
                int res_useNum_increase = cou_biz.update_useNum_increase(theUsedCouponTypeId);//0代表update失败！
                System.out.println("res_useNum_increase: "+res_useNum_increase);
            }
        }

        // 3 扣除积分 扣除余额
        if($car_price.getDouble("pointsFee") > 0){  //1
            u_biz.update_couponOrBalance( $car_price.getDouble("pointsFee") * 100 ,  $user_id);//0代表update失败！
        }
        if($car_price.getDouble("balance") > 0){
            u_biz.update_couponOrBalance( $car_price.getDouble("balance"),  $user_id);//0代表update失败！
        }

        // 4 删除已提交  订单商品
        int res_deleteCart_afterSubmitOrder = cart_biz.deleteCart_afterSubmitOrder( $user_id);//0代表 连一条都没有删


        // 5 记录log日志 到`tp_account_log`： // 如果使用了积分或者余额才记录

        //分销开关全局

        // 如果有微信公众号 则推送一条消息到微信

        //order_id

        OrderVirtual2App ov_for_app = order_biz.get_OrderVirtual2App( orderPO );

        JSONObject  jb = new JSONObject(); jb.put("status", 1); jb.put("msg", "提交订单成功"); jb.put("result", ov_for_app);  //jb.put("result", order_id);
        return jb;
    }

    /**
     * 查看订单是否满足条件参加活动
     *   order_amount 订单应付金额
     */
    public JSONObject get_order_promotion(double $order_amount){
        //`tp_prom_order`表
        return null;
    }

    /**
     * 计算订单金额
     *  type $user_id  用户id
     *  type $order_goods  购买的商品	//selected = 1 的 cart对象
     *  type $shipping  物流code
     *  type $shipping_price 物流费用(物流费), 如果传递了物流费用 就不在计算物流费
     *  type $province  省份
     *  type $city 城市
     *  type $district 县
     *  type $pay_points 积分
     *  type $user_money 余额
     *  type $coupon_id  优惠券
     *  type $couponCode  优惠码
     */
    //public double calculate_price($user_id=0,  $order_goods, 	   $shipping_code='',       $province=0,$city=0,$district=0,     $pay_points=0,    $user_money=0,     $coupon_id=0,$couponCode=''){
    public JSONObject calculate_price(int $user_id,List<TpCart> $order_goods,String $shipping_code,
                                      int $province,int $city,int $district,int $pay_points,Double $user_money,String $coupon_id,String $couponCode, String $couponTypeSelect
//			,int $shipping_price   //$shipping_price并不是传参传过来的！
    ){

        TpUsers loginUser = user_biz.findUser_ById($user_id);

        //			 									{"status": -99,   "msg": "",    "result": ""}
//		JSONObject  string2jb = JSONObject.fromObject( "{\"status\": -99,\"msg\": \"\",\"result\": \"\"}" );
        if($order_goods==null || $order_goods.isEmpty()){ //selected = 1 的 cart对象
            JSONObject  string2jb = new JSONObject(); string2jb.put("status", -9); string2jb.put("msg", "商品列表不能为空"); string2jb.put("result", "");
            return string2jb;
        }

        int $goods_weight_total = 0;//累积商品重量
        double $goods_price = 0;	// 小计
        double $cut_fee = 0;		// 共节约
        int $anum = 0;      		// 购买数量
        //List<TpCart> cartList = cart_biz.findCartList_withChecked();
        for (int i = 0; i < $order_goods.size(); i++) {
            TpGoods $goods_arr = goods_biz.findGoods_bygoodsId( $order_goods.get(i).getGoodsId() ); //cart中你 选中的那些goods

//			// 如果传递过来的商品列表没有定义会员价
//            if(!array_key_exists('member_goods_price',$val))  // diy先用 'shop_price' 替代 'member_goods_price'!!!
//            {
//                $user['discount'] = $user['discount'] ? $user['discount'] : 1; // 会员折扣 不能为 0   diy先用 'shop_price' 替代 'member_goods_price'!!!   到时候再给user表增加'discount'属性
//                $order_goods[$key]['member_goods_price'] = $val['member_goods_price'] = $val['goods_price'] * $user['discount'];
//            }

            //如果商品不是包邮的 就要计算运费
            if( $goods_arr.getIsFreeShipping() == 0 ){
                $goods_weight_total += $goods_arr.getWeight() * $order_goods.get(i).getGoodsNum();//累积商品重量 = 每种商品的重量  * cart中选择的数量
            }

//			$order_goods[$key]['goods_fee'] = $val['goods_num'] * $val['member_goods_price'];    										// 小计            diy先用 'shop_price' 替代 'member_goods_price'!!!
            double xiaoji =  $order_goods.get(i).getGoodsNum() * goods_biz.findGoods_bygoodsId($order_goods.get(i).getGoodsId() ).getShopPrice().doubleValue();// 小计

            int store_count = sgp_biz.find_SpecGoodsPrice_by_primaryKey( $order_goods.get(i).getMiddleSpecId() ).getStoreCount();// 最多可购买的库存数量
            if(store_count <= 0) {
                JSONObject  jb = new JSONObject(); jb.put("status", -10); jb.put("msg", "库存不足,请重新下单"); jb.put("result", "");
                return jb;
            }

            $goods_price += xiaoji; 				// 商品总价
//			$cut_fee     += $val['goods_num'] * $val['market_price'] - $val['goods_num'] * $val['member_goods_price']; // 共节约  以后有机会再添加'member_goods_price'!
            $cut_fee += ($order_goods.get(i).getGoodsNum() * goods_biz.findGoods_bygoodsId($order_goods.get(i).getGoodsId() ).getMarketPrice().doubleValue()) -
                    ($order_goods.get(i).getGoodsNum() * goods_biz.findGoods_bygoodsId($order_goods.get(i).getGoodsId() ).getShopPrice().doubleValue());// 共节约

            $anum += $order_goods.get(i).getGoodsNum(); // 购买总数量
        }

        // 优惠券处理操作
        JSONObject $coupon_result;
        double $coupon_price = 0;
        //没有选择 用 coupon 则 $coupon_price仍然 = 0;
        if(CommonFunction.stringCheckNotNull($couponTypeSelect) ){ //&& CommonFunction.stringCheckNull($coupon_id) && CommonFunction.stringCheckNull($couponCode)
            if($couponTypeSelect.equals("1")){ // 1 下拉框选择优惠券(优惠券id) 2 输入框输入优惠券代码（code）
                //getCouponMoney:获取coupon的 面额
                $coupon_price = (Double) getCouponMoney($user_id, Integer.parseInt($coupon_id), 1); // 下拉框方式选择优惠券  mode=1 返回 double, mode=0 返回json形式
            }else{ //$couponTypeSelect.equals("2")
                $coupon_result = getCouponMoneyByCode($couponCode,$goods_price); // 根据 优惠券 号码获取的优惠券
                if($coupon_result.getInt("status") < 0 ) { // $coupon_result['status'] < 0
                    return $coupon_result;
                }else{
                    $coupon_price = $coupon_result.getDouble("result");
                }
            }
        }

        // 处理物流  $shipping_price并不是传参传过来的！
        int $shipping_price = cart_freight2($shipping_code,$province,$city,$district,$goods_weight_total); //计算商品的的运费(物流费)
//		$freight_free = tpCache('shopping.freight_free'); // 全场满多少免运费
//        if($freight_free > 0 && $goods_price >= $freight_free){
//        	$shipping_price = 0;
//        }

        System.out.println("测试-100:"+$shipping_price);

        // 积分抵消金额
        if($pay_points > loginUser.getPayPoints() ){ //($pay_points > $user['pay_points'])
            JSONObject jb = new JSONObject(); jb.put("status", -5); jb.put("msg", "你的账户可用积分为:"+loginUser.getPayPoints()); jb.put("result", "");
            return jb;
        }
        // 使用余额
        if($user_money > loginUser.getUserMoney().doubleValue() ){ //($user_money > $user['user_money'])
            JSONObject jb = new JSONObject(); jb.put("status", -6); jb.put("msg", "你的账户可用余额为:"+loginUser.getUserMoney()); jb.put("result", "");
            return jb;
        }

        // 应付金额			= 		商品价格 	+ 物流费 			  - 优惠券
        double $order_amount = $goods_price + $shipping_price - $coupon_price; // 应付金额 = 商品价格 + 物流费 - 优惠券
        System.out.println("测试-101:"+$order_amount);

//		$pay_points = ($pay_points / tpCache('shopping.point_rate')); // 积分支付 100 积分等于 1块钱   在此句之前它是积分，在此之后它是 钱数
        $pay_points = Math.round($pay_points / 100);				  // 积分支付 100 积分等于 1块钱   在此句之前它是积分，在此之后它是 钱数
        $pay_points = (int) (($pay_points > Math.round($order_amount)) ? $order_amount : $pay_points); // 假设应付 1块钱 而用户输入了 200 积分 2块钱, 那么就让 $pay_points = 1块钱 等同于强制让用户输入1块钱
        $order_amount = $order_amount - $pay_points; //  积分抵消应付金额

        $user_money = ($user_money > $order_amount) ? $order_amount : $user_money;  // 余额支付原理等同于积分
        $order_amount = $order_amount - $user_money; //  余额支付抵应付金额

        double $total_amount = $goods_price + $shipping_price; // 商品总价（不用任何优惠券！）
        System.out.println("测试-102:"+$total_amount);

        //订单总价  应付金额  物流费  商品总价 节约金额 共多少件商品 积分  余额  优惠券
        JSONObject jb1 = new JSONObject();
        jb1.put("total_amount", $total_amount);		// 商品总价
        jb1.put("order_amount", $order_amount);		// 应付金额
        jb1.put("shipping_price", $shipping_price);	// 物流费
        jb1.put("goods_price", $goods_price);		// 商品总价
        jb1.put("cut_fee", $cut_fee);				// 共节约多少钱
        jb1.put("anum", $anum);						// 商品总共数量
        jb1.put("integral_money", $pay_points); 	// 积分抵消金额
        jb1.put("user_money", $user_money);			// 使用余额
        jb1.put("coupon_price", $coupon_price);		// 优惠券抵消金额
        jb1.put("order_goods", $order_goods);		// 商品列表 多加几个字段原样返回

        System.out.println("测试-102.1:");
        JSONObject jb2 = new JSONObject(); jb2.put("status", 1); jb2.put("msg", "计算价钱成功"); jb2.put("result", jb1);
        System.out.println("测试-102.2:" );
        return jb2;
    }



    /**
     * 获取用户可以使用的优惠券
     *  type $user_id  用户id
     *  type $coupon_id 优惠券id
     * $mode 0  返回json形式  1 直接返回result
     */
    public Object getCouponMoney(int $user_id, int $coupon_id,int $mode) {
//        $couponlist = M('CouponList')->where("uid = $user_id and id = $coupon_id")->find(); // 获取用户的优惠券
        TpCouponList $couponlist = cl_biz.findById($coupon_id);//直接用 $coupon_id(优惠券表id) 就可以找到，因为他是唯一的主键！
        if(null!=$couponlist && !"".equals($couponlist)) {
//	      		 	 $coupon = M('Coupon')->where("id = {$couponlist['cid']}")->find(); // 获取 优惠券类型表
            TpCoupon $coupon= cou_biz.findById($couponlist.getCouponId());
//	        $coupon['money'] = $coupon['money'] ? $coupon['money'] : 0;

            if($mode == 1) {
                return $coupon.getMoney();
            }else{
                JSONObject  jb = new JSONObject(); jb.put("status", 1); jb.put("msg", ""); jb.put("result", $coupon.getMoney());
                return jb;
            }
        } else{ // 没找到
            if($mode == 1) {
                return 0;
            }else{
                JSONObject  jb = new JSONObject(); jb.put("status", 1); jb.put("msg", ""); jb.put("result", 0);
                return jb; //$mode==1 返回JSONObject
            }
        }
    }
    /**
     * 根据优惠券代码获取优惠券金额
     *  type $couponCode 优惠券代码
     *  type $order_momey Description 订单金额（商品 总价）
     * return -1 优惠券不存在 -2 优惠券已过期 -3 订单金额没达到使用券条件
     */
    public JSONObject getCouponMoneyByCode(String $couponCode,double $order_momey){
//       			 $couponlist = M('CouponList')->where("code = '$couponCode'")->find(); // 获取用户的优惠券
        TpCouponList $couponlist = cl_biz.findCouponList_byCode($couponCode);//直接用 (优惠券兑换码)
        if(null!=$couponlist && !"".equals($couponlist)) {
            TpCoupon $coupon = cou_biz.findById( $couponlist.getCouponId() );
            //java取时间戳是13位的，要舍弃后三位，就是php中的10位了，不影响正常使用  System.currentTimeMillis()).toString().substring(0,10)
            int time_current = Integer.parseInt(String.valueOf(System.currentTimeMillis()).toString().substring(0,10));
            if(time_current > $coupon.getUseEndTime()) { //time() > $coupon['use_end_time']
                JSONObject  jb = new JSONObject(); jb.put("status", -10); jb.put("msg", "优惠券已经过期"); jb.put("result", "");
                return jb; //
            }
            if($order_momey < $coupon.getCondition().doubleValue()) { //$order_momey(订单金额（商品 总价）) < $coupon['condition']
                JSONObject  jb = new JSONObject(); jb.put("status", -11); jb.put("msg", "金额没达到优惠券使用条件"); jb.put("result", "");
                return jb; //
            }
            if($couponlist.getOrderId() > 0){ //$couponlist['order_id'] > 0
                JSONObject  jb = new JSONObject(); jb.put("status", -12); jb.put("msg", "优惠券已被使用"); jb.put("result", "");
                return jb; //
            }

//        	return array('status'=>1,'msg'=>'','result'=>$coupon['money']);
            JSONObject  jb = new JSONObject(); jb.put("status", 1); jb.put("msg", ""); jb.put("result", $coupon.getMoney());
            return jb;

        }else{// 没找到
            JSONObject  jb = new JSONObject(); jb.put("status", -9); jb.put("msg", "优惠券码不存在"); jb.put("result", "");
            return jb; //
        }



    }



    // `tp_user_address`表的district、city、province编码 == `tp_region`字典表 的主键id
    //计算商品的的运费(物流费)					物流 编号													 累积商品重量(单位：克)
    public int cart_freight2(String $shipping_code, int $province, int $city, int $district,  int $weight) {

        System.out.println("测试-99:" );

        if($weight == 0) return 0; // 商品没有重量
        if($shipping_code == null || "".equals($shipping_code)) return 0;    //  物流编号

        List<Integer> shippingAreaId = new ArrayList<>();

        // 先根据 镇 县 区($district)找 shipping_area_id:
        int $shipping_area_id = sa_biz.find_shipping_area_id($shipping_code, $district) ;						 // -1代表 在db中没有找到结果！
        // $district找不到  则根据市区找 shipping_area_id
        if($shipping_area_id == -1) $shipping_area_id = sa_biz.find_shipping_area_id($shipping_code, $city) ;	 // -1代表 在db中没有找到结果！
        // 市区找不到  则根据省份找shipping_area_id
        if($shipping_area_id == -1) $shipping_area_id = sa_biz.find_shipping_area_id($shipping_code, $province) ;// -1代表 在db中没有找到结果！
        // 省份找不到 找默认配置全国的物流费 // 如果市和省份都没查到, 就查询 tp_shipping_area 表 is_default = 1 的  表示全国的  select * from `tp_plugin`  select * from  `tp_shipping_area` select * from  `tp_area_region`
        if($shipping_area_id == -1) $shipping_area_id = sa_biz.find_shipping_area_id($shipping_code ).get(0) ;	// -1代表 在db中没有找到结果！ ?????先取第一个，日后再改
        if($shipping_area_id == -1)	return 0;

        // if找到了 shipping_area_id  找config
        //##`tp_shipping`和 `tp_shipping_area`也是“多对多”的关系！但user只会选择一个`tp_shipping`！so用户用到的只是`tp_shipping`对 `tp_shipping_area`“一对多”的关系(此时就需要用user选择的收货地址 来决定了！)
        //所以此时得到的应该是 只有一个 $shipping_area_id ？？？？？？？？？？？？？？？？？？？？？？
        TpShippingArea shippingArea = sa_biz.find_config_by_keyId($shipping_area_id);
        String $shipping_config = shippingArea.getConfig();
        //接下来就是要解析这个json格式的$shipping_config了	'{"first_weight": 1000,"second_weight": 2000,"money": 12,"add_money": 2}'
        JSONObject  string2jb = JSONObject.fromObject( $shipping_config );
        // 1000 克以内的 只算个首重费
        if($weight < string2jb.getInt("first_weight"))  return string2jb.getInt("money");
        // 超过 1000 克的计算方法 :
        $weight = $weight - string2jb.getInt("first_weight"); // 续重
        $weight = (int) Math.ceil($weight / string2jb.getInt("second_weight")); // 续重不够取整  //向上取整，Math.ceil(12.3)的结果是13，Math.ceil(-12.7)的结果-12；

        //最终计算的商品运费 (物流费)
        int $freight = string2jb.getInt("money") +  $weight * string2jb.getInt("add_money"); // 首重 + 续重 * 续重费
        //解释：加入你选择申通物流(`shipping_code`='sto_express'), 进		而		得		到     `tp_shipping_area`.`shipping_area_id`
        //    然后再根据你填写送过地址,跟申通的送货区域(不同地区有不同的收费标准<定死的!>),与申通的送货区域对比 找到`tp_shipping_area`.`shipping_area_id`
        //然后算出运费(so最后得到的应该是 只有一个 $shipping_area_id )


        System.out.println("测试-99.9:" );
        return $freight;
    }









    /*
      600: addOrder()
      700： 提交order后 删除上一刻钟刚刚selected=1的cart中的cart对象, 同时为了记录当前这个order所持有的goodsList 故把它  插入到`tp_order_goods`表


    */
    public String listToString(List list, String separator) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < list.size(); ++i) { // i++也行
            sb.append(list.get(i)).append(separator);
        }
        return separator.equals("")?sb.toString():sb.toString().substring(0, sb.toString().length() - 1);
    }

}

